package juc.exchanger;

import java.util.List;
import java.util.concurrent.Exchanger;

/**
 * exchanger线程1： 生产者线程
 * 
 * @author guweiqiang
 * 2018年7月17日
 */
public class Producer implements Runnable {
	
	// 生产者与消费者需要交换的数据
	private List<String> data;
	
	// 生产者和消费者的交换对象
	private Exchanger<List<String>> exchanger;
	
	Producer(List<String> data, Exchanger<List<String>> exchanger) {
		this.data = data;
		this.exchanger = exchanger;
	}

	/**
	 * 生产者线程操作
	 */
	public void run() {
		// 生产者循环往data里存放数据
		for(int j=1; j<=5; j++) {
			System.out.println("Producer 往data里存入j：" + j);
			data.add("data:" + j);
		}
		
		System.out.println("Producer 已存好了data，等待和Consumer进行exchange...");
		
		try {
			/**
			 * 在Exchanger中，如果一个线程已经到达了exchanger节点时，对于它的伙伴节点的情况有三种：
					1) 如果它的伙伴节点在该线程到达之前已经调用了exchanger方法，则它会唤醒它的伙伴然后进行数据交换，得到各自数据返回；
					2) 如果它的伙伴节点还没有到达交换点，则该线程将会被挂起，等待它的伙伴节点到达被唤醒，完成数据交换；
					3) 如果当前线程被中断了则抛出异常，或者等待超时了，则抛出超时异常。
			 */
			exchanger.exchange(data); // 还有一个超时等待的重载方法
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
